package Serveur;

import Client.I_ChatClient;
import java.io.File;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Serveur extends UnicastRemoteObject implements I_serveur {
        
        private static final long serialVersionUID = 1L;
        //Nombre d'utilisateur maximum du serveur
        private int nb_utilisateur;
        //Taille maximale des fichier envoyés au serveur
        private int tailleFichier;
        //Liste des utilisateurs du chat
        public LinkedList <I_ChatClient> clients;
        //Historique des messages du chat 
        public ArrayList <String> history;
        
        //Constructeur du serveur
        public Serveur() throws RemoteException {
            super();
            Scanner sc = new Scanner(System.in); 

            //Fixe le nombre d'utilisateur maximal du serveur
            System.out.println("Veuillez indiquer le nombre d'utilisateur maximal sur le serveur que vous souhaitez : ");
            setNb_utilisateur(sc.nextInt());

            //Fixe la taille maximale des fichiers sur le serveur
            System.out.println("Veuillez indiquer la taille maximale (en ko) des fichiers sur le serveur : ");
            setTailleFichier(sc.nextInt());
            //Instancie la liste des utilisateurs du chat
            clients = new LinkedList<I_ChatClient>();
            //Instancie l'historique du chat
            history = new ArrayList<String>();
        }
        
        @Override
        public synchronized void connecter(I_ChatClient client) throws RemoteException {
            if(nbUtilisateursValide(clients)){
                clients.add(client); 
                //Affiche l'historique des messages
                if (!history.isEmpty()) {
                  for (int i = 0; i < history.size(); i++) {
                    client.recevoir(history.get(i), "", 'h');  
                  }  
                }
                System.out.println(client+" se connecte au serveur");
            }
        }

        @Override
        public void deconnecter(I_ChatClient client) throws RemoteException {
          clients.remove(client); 
            System.out.println(client+" se deconecte du serveur");
        }
        
        @Override
        public int chercherNom(String nom) throws RemoteException{
            int res=0;
            for(int j=0;j<clients.size();j++){
                if(clients.get(j).getNomClient().equals(nom)){
                    res=j;
                }
            }
            
            return res;
        }
        
        @Override
        public boolean UtilisateurValide(String nom) throws RemoteException{
            boolean rep=true;
            for(int i=0;i<clients.size();i++){
                if(clients.get(i).getNomClient().equalsIgnoreCase(nom)){
                    rep=false;
                }
            }
            return rep;
        }
        
        //Fonction permettant de voir si le nom d'utilisateur et son mot de passe sont coreecte
        //Et que l'utilisateur n'est pas déjà connecté
        @Override
        public String login() throws RemoteException{
           System.out.println("CCCCCCCCCCCCCCCCCCCC"); 
           boolean rep=true;
           //boolean rep2=true;
           String nom="";
           String mdp="";
           do{
                System.out.println("DDDDDDDDDDDDDDDDDD");
                System.out.println("Entrez votre nom d'utilisateur : ");
                Scanner forname = new Scanner(System.in);
                nom=forname.nextLine();
                //mdp=forname.nextLine();
                //rep2=verifLogin(nom, mdp);
                rep=UtilisateurValide(nom);
                if(!rep){
                    System.out.println("L'utilisateur est déjà connecté");
                }
                /*if(!rep2){
                    System.out.println("Mot de passe invalide ou nom d'utilisateur érroné !");
                    ajouterLog(nom, mdp);
                }*/
            }while(!rep);
            return nom;
        }

        @Override
        public boolean nbUtilisateursValide(LinkedList<I_ChatClient> liste) throws RemoteException{
            boolean valide = false;
            if(liste.size() > getNb_utilisateur()){
                try {
                    throw new Exception("Serveur complet");
                } 
                catch (Exception ex) {
                    Logger.getLogger(Serveur.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            else{
                valide = true;
            }
            return valide;
        }

        @Override
        public boolean tailleFichierValide(File fichier) throws RemoteException{
            boolean valide = false;
            if(fichier.length()/1024 > getTailleFichier()){
                try {
                    throw new Exception("Fichier trop volumineux");
                } 
                catch (Exception ex) {
                    Logger.getLogger(Serveur.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            else{
                valide = true;
            }
            return valide;
        }

        /** Retourne la taille maximale des fichiers qu'on peut envoyer sur le serveur
         * @return la taille max des fichiers en ko
         */
        public int getTailleFichier() {
            return tailleFichier;
        }

        /** Affecte la taille maximale des fichiers qu'on peut envoyer sur le serveur
         * @param nb_utilisateur la taille max des fichiers en ko
         */
        public void setTailleFichier(int tailleFichier) {
            this.tailleFichier = tailleFichier /1024;
        }

        /** Retourne le nombre d'utilisateur maximum du serveur
         * @return le nombre d'utilisateur max
         */
        public int getNb_utilisateur() {
            return nb_utilisateur;
        }

        /** Affecte le nombre d'utilisateur maximum du serveur
         * @param nb_utilisateur le nombre d'utilisateur max
         */
        public void setNb_utilisateur(int nb_utilisateur) {
            this.nb_utilisateur = nb_utilisateur;
        }
        /*
        @Override
        //Fonction permettant de vérifier si le nom de l'utilisateur et son mot de passe sont correctes
        public boolean verifLogin(String nom, String motdPasse)throws RemoteException{
            boolean rep=false;
            try
            {
                File f = new File ("log");
                Scanner scanner = new Scanner (f);
                String name;
                String mdp;
                while (true)
                {
                        name = scanner.next();
                        mdp = scanner.next();
                        if (name.equalsIgnoreCase(nom) && mdp.equals(motdPasse))
                            {
                                rep=true;
                                scanner.close();
                            }                     
                }
                
            }
            catch (FileNotFoundException exception)
            {
                System.out.println ("Le fichier n'a pas été trouvé");
            }
            return rep;
        }
        */
        
        /*
        //Création d'un fichier contenant les noms d'utilisateur et les mot de passe
        public void creerFichLog(){
                File fichier = new File("logs.txt");
                if (fichier.exists()) {
                        System.out.println("Le fichier existe déjà !");
                } else {
                try {
                    fichier.createNewFile();
                } catch (IOException ex) {
                    Logger.getLogger(Serveur.class.getName()).log(Level.SEVERE, null, ex);
                }
                        System.out.println("Le fichier a été crée !");
                }
                this.fichier=fichier;
        }
        */
        
        
        
        
        /*
         public void ajouterLog(String nomU,String mdp){
            FileWriter outFile = null;
            try {
                outFile = new FileWriter(this.fichier);
                PrintWriter out = new PrintWriter(outFile);
                out.print(nomU);
                out.println(mdp);
                out.close();
            } catch (IOException ex) {
                Logger.getLogger(Serveur.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    outFile.close();
                } catch (IOException ex) {
                    Logger.getLogger(Serveur.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } */

        
}
